package com.xhui.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xhui.reggie.common.R;
import com.xhui.reggie.entity.Employee;
import com.xhui.reggie.service.EmployeeService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Objects;

@Slf4j
@RestController
@RequestMapping("/employee")
public class EmployeeController {

    @Resource
    private EmployeeService employeeService;

    /**
     * 部分方法较多使用，故提升到成员变量位置
     * request 若用户名和密码比对成功，需要对用户名进行session存储,便于其他Servlet使用
     */
    @Resource
    private HttpServletRequest request;

    /**
     * 员工登录
     * @param employee 用户名和密码封装对象
     * @return R实例
     */
    @PostMapping("/login")
    public R<Employee> login(@RequestBody Employee employee){
        // 1.对前端传递过来的密码进行md5加密
        String password = employee.getPassword();
        password = DigestUtils.md5DigestAsHex(password.getBytes());

        // 2. 判断用户是否存在
        LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
        //构造 判断表中的字段username中的值 与 用户名是否相等
        queryWrapper.eq(Employee::getUsername, employee.getUsername());
        Employee queriedEmployee = employeeService.getOne(queryWrapper);

        //3.无此用户，登录失败 || 用户存在，密码比对是否一致
        if (queriedEmployee == null || !Objects.equals(queriedEmployee.getPassword(), password)){
            return R.error("登录失败");
        }

        //4. 判断员工状态是否被禁用, 若被禁用，返回被封禁
        if (queriedEmployee.getStatus() == 0){
            return R.error("账号被封禁，请尝试联系管理员！");
        }

        //6. 登录成功，将员工id存入Session中,返回login success
        request.getSession().setAttribute("employee", queriedEmployee.getId());
        return R.success(queriedEmployee);
    }
    /**
     * 员工退出
     * @param request 请求对象
     * @return 实体R
     */
    @PostMapping("/logout")
    public R<String> logout(HttpServletRequest request){
        //1. 清理Session保存的当前登录员工id
        request.getSession().removeAttribute("employee");
        return R.success("退出成功");
    }

    /**
     * 新增员工
     * @param employee 新增员工信息
     * @return 实体R
     */
    @PostMapping
    public R<String> save(@RequestBody Employee employee){
        log.info("新增员工, 员工信息 {}", employee);

        // 设置初始密码123456, 需要进行md5加密处理
        employee.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));

        // 获取当前用户的id
        Long empId = (Long) request.getSession().getAttribute("employee");
        /**
         * 作为通用字段，使用MyMetaObjectHandler进行自动处理
         */
        /*employee.setCreateUser(empId);
        employee.setUpdateUser(empId);
        employee.setCreateTime(LocalDateTime.now());
        employee.setUpdateTime(LocalDateTime.now());*/
        employeeService.save(employee);
        return R.success("新增员工成功");
    }

    /**
     * 员工信息分页查询
     * @param page 页数
     * @param pageSize 页面展现数量
     * @param name 员工姓名
     * @return 分页查询数据
     */
    @GetMapping("/page")
    public R< Page<Employee> > getByPage(int page, int pageSize, String name) {
        log.info("page {}, pageSize {} , name {} ", page, pageSize, name);
        // 1.构造分页构造器
        Page<Employee> employeePage = new Page<>(page, pageSize);

        // 2.构造条件构造器
        LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
        // 添加模糊查询条件
        queryWrapper.like(StringUtils.isNotBlank(name), Employee::getName, name);
        // 添加排序条件
        queryWrapper.orderByDesc(Employee::getUpdateTime);

        //3. 执行查询
        employeeService.page(employeePage, queryWrapper);

        return R.success(employeePage);
    }

    /**
     * 有权限的管理员 修改 普通员工的账号状态 
     * @param employee 普通员工信息
     * @return 实体类
     */
    @PutMapping
    public R<String> update(@RequestBody Employee employee){
        log.info("线程id ===> {}", Thread.currentThread().getId());
        /* // 1.获取当前登录用户的id值
        Long empId = (Long) request.getSession().getAttribute("employee");
        // 2. 通过service层进行修改普通员工的信息
        employee.setUpdateUser(empId);
        employee.setUpdateTime(LocalDateTime.now());*/
        employeeService.updateById(employee);
        return R.success("员工信息修改成功");
    }

    /**
     * 根据id查询员工信息便于修改指定员工的信息，之所以不从本地已得到的数据中使用，个人感觉是因为可能多个
     * @param id id值
     * @return 返回员工信息
     */
    @GetMapping("/{id}")
    public R<Employee> getById(@PathVariable Long id){
        log.info("查询到员工id ===> {}", id);
        Employee queriedEmployee = employeeService.getById(id);
        return R.success(queriedEmployee);
    }
}
